[Snowflake新機能]タスクがEXECUTE TASKコマンドにより手動実行できるようになりました #SnowflakeDB
さがらです。
Snowflakeで定期的にクエリをスケジューリング実行したい場合はタスクを用いますが、手動でスケジューリング設定したタスクを実行できるEXECUTE TASK
コマンドが使えるようになりました。※2022年2月24日時点ではまだプレビュー機能です。
本記事ではこのコマンドを試してみた内容をまとめてみます。
前置き:タスクとは
まず、Snowflakeのタスクについて振り返ります。
タスクは、任意のSQLについて定期的なスケジュールを組んで実行できる機能です。
データ分析基盤において、定期的にSQLを実行して分析に使用するテーブルを更新するバッチ処理はほぼ必須の機能です。このバッチ処理に当たることをタスクで実現できます。
また、対象のテーブルの変更データを保持するストリームと合わせることで、新しいデータの更新があったらタスクを実行するという処理も実現可能です。
タスク、及びタスクとストリームの組み合わせについては弊社でも記事を書いておりますので、ぜひ併せて御覧ください。
EXECUTE TASKコマンドとは
タスクはこれまで基本的に、スケジュール実行しかできませんでした。しかし、今回EXECUTE TASK
コマンドが追加されたことにより、手動実行できるようになりました!
手動実行できることによるメリットは、このような点が挙げられると思います。
- タスク作成後、想定通りに動くかテスト実行したいとき
- スケジューリングしているタスクのエラーに気づき、データやクエリの修正後に再度タスクを実行したい時
使い方
使い方はとても簡単で、EXECUTE TASK
のあとに対象のタスク名を入れるだけでOKです。
EXECUTE TASK <name>
コマンドの仕様
このコマンドを使うにあたっての仕様を簡単にまとめておきます。(公式Docより)
- このコマンドでタスクを実行するには、タスクのOWNERSHIP権限またはOPERATE権限のいずれかが必要
- 親子関係を持つタスクにおいて、親に当たるルートタスクが実行され成功すると、ツリー内の子タスクも実行される (子タスクも
started(開始済み)
の時のみ)- 一方で、子タスクを
EXECUTE TASK
で実行するとエラーを返す
- 一方で、子タスクを
より詳細な仕様は、EXECUTE TASKの公式Docを御覧ください。
試してみた
EXECUTE TASK
コマンドについて仕様は色々と書いてあったのですが、「対象タスクが開始しているかどうか」で挙動が本当に変わるかを確かめてみます。
事前準備
下記のクエリを実行して、検証に使用するテーブルやタスクを準備します。
-- タスク実行のためのデータベースを作る use role sysadmin; create or replace database sagara_tasktest_db; -- サンプルデータを元に、タスク実行用の新しいテーブルを作る use database sagara_tasktest_db; use schema public; create or replace table my_customer as select * from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."CUSTOMER"; -- ルートタスクの作成 use role accountadmin; -- 今回は検証のため、ACCOUNTADMINで実施します。実運用ではTASKADMINのようなロールを作ることが望ましいです。 create or replace task sagara_testtask_root user_task_managed_initial_warehouse_size = 'XSMALL' schedule = '11520 minute' as create or replace table my_customer_2 as select * from my_customer; -- 子タスクの作成 create or replace task sagara_testtask_child user_task_managed_initial_warehouse_size = 'XSMALL' after sagara_testtask_root as create or replace table my_customer_3 as select * from my_customer_2;
実際にタスクを実行したり、ステータスを変更する際は下記のクエリから必要なものを実行します。
-- タスクの一覧確認 show tasks; -- タスクの一時停止時に行うコマンド alter task sagara_testtask_root suspend; alter task sagara_testtask_child suspend; -- タスクの再開時に行うコマンド select system$task_dependents_enable('sagara_tasktest_db.public.sagara_testtask_root'); -- タスクの手動実行コマンド execute task sagara_testtask_root; execute task sagara_testtask_child;
親子関係になっているタスクのルートタスクを実行した時(すべてのタスクが「一時停止」)
下図のように表示されて、ルートタスクは実行されたのですが、続く子タスクは実行されませんでした。
親子関係になっているタスクの子タスクを実行した時(すべてのタスクが「一時停止」)
下図のように、エラーが表示されました。
親子関係になっているタスクのルートタスクを実行した時(すべてのタスクが「開始済み」)
下図のように表示されて、ルートタスクのあとに子タスクも実行されました。
親子関係になっているタスクの子タスクを実行した時(すべてのタスクが「開始済み」)
下図のように、エラーが表示されました。
まとめ
手動でスケジューリング設定したタスクを実行できるEXECUTE TASK
コマンドについてまとめてみました。
Snowflake単体でスケジューリング処理を行う場合にはタスクは必須ですので、活用していきましょう!